/**
 * 简单Ajax请求
 * @param requestUrl 请求地址
 * @param data 数据
 * @param toUrl 成功后跳转地址
 */
function hd_ajax(requestUrl, data, toUrl, timeout) {
    var timeout = timeout || 2;
    $.ajax({
        url: requestUrl,
        data: data,
        type: 'POST',
        dataType: 'json',
        success: function (json) {
            hd_alert({
                message: json.message,//显示内容
                timeout: timeout,//显示时间
                success: function () {//这是回调函数
                    if (json.status && toUrl)location.href = toUrl;
                }
            })
        }
    })
}
/**
 * Form表单提交事件
 * @param obj Form表单对象
 * @param requestUrl 请求Url
 * @param toUrl 跳转地址
 */
function hd_submit(obj, requestUrl, toUrl, timeout) {
    var timeout = timeout || 1;
    if (!$(obj).data('isPost')) {
        $(obj).data('isPost', 1);
        $.ajax({
            url: requestUrl,
            data: $(obj).serialize(),
            type: 'POST',
            dataType: 'json',
            success: function (json) {
                hd_alert({
                    message: json.message,//显示内容
                    timeout: timeout,//显示时间
                    success: function () {//这是回调函数
                        if (json.status && toUrl)location.href = toUrl;
                    }
                })
                $(obj).removeData('isPost');
            }
        })
    }
    return false;
}
/**
 * 显示对话框
 */
function hd_alert(param) {
    param.timeout=param.timeout||3;
    /**
     * 关闭气泡
     */
    hd_alert_close();
    /**
     * 添加HTML标签
     */
    var html='<div id="hd-alert">'+param.message+'</div>';
    $("body").append(html);
    /**
     * 设置动画
     */
    $("#hd-alert").animate({
        top:'-30px'
    }, 500).delay(200).animate({top:'-100px'},param.timeout*1000,'',function(){
        if(param.success){
            param.success();
        }
    });

}
function hd_alert_close() {
    $("#hd-alert").remove();
}
//成功时执行事件
var hd_confirm_success_handlel;
//关闭时执行事件
var hd_confirm_cancel_handle;
/**
 * 显示对话框
 */
function hd_confirm(param) {
    param.title = param.title || '温馨提示';
    param.message = param.message || '这是提示信息';
    hd_confirm_success_handlel = param.success;
    hd_confirm_cancel_handle = param.cancel;
    //关闭对话框
    hd_confirm_close();
    /**
     * 对话框布局
     * @type {string}
     */
    var html = '<div id="hd-confirm-bg">背景遮罩</div>\
    <div id="hd-confirm">\
    <div class="hd-confirm-header">\
        <span class="hd-confirm-title">' + param.title + '</span>\
        <span class="hd-confirm-close" onclick="hd_confirm_close();"></span>\
    </div>\
    <div class="hd-confirm-message">' + param.message + '</div>\
        <div class="hd-confirm-btn">\
            <a class="hd-btn hd-btn-success" href="javascript:;" onclick="hd_confirm_success()">确 定</a>&nbsp;&nbsp;\
            <a class="hd-btn" href="javascript:;" onclick="hd_confirm_close()">关 闭</a>\
        </div>\
    </div>';
    $('body').append(html);
}
/**
 * 点击确定返回真
 * @returns {boolean}
 */
function hd_confirm_success(func) {
    //移除对话框
    $("#hd-confirm").remove();
    //移除遮罩
    $("#hd-confirm-bg").remove();
    if (hd_confirm_success_handlel) {
        hd_confirm_success_handlel();
    }
    return true;
}
/**
 * 关闭对话框
 */
function hd_confirm_close() {
    //移除对话框
    $("#hd-confirm").remove();
    //移除遮罩
    $("#hd-confirm-bg").remove();
    if (hd_confirm_cancel_handle) {
        hd_confirm_cancel_handle();
    }
    return false;
}
/**
 * cookie操作类
 */
var cookie = {
    set: function (name, value, iDay) {
        var oDate = new Date();
        oDate.setDate(oDate.getDate() + iDay);
        document.cookie = name + '=' + value + ';expires=' + oDate;
    },
    get: function (name) {
        var arr = document.cookie.split('; ');
        for (var i = arr.length - 1; i >= 0; i--) {
            var arr2 = arr[i].split('=');
            if (arr2[0] === name) {
                return arr2[1];
            }
        }
        return '';
    },
    del: function (name) {
        cookie.set(name, 1, -1);
    }
}
/**
 * 全选
 * @param element
 */
function hd_select_all(element) {
    $(element).find($("[type='checkbox']")).attr("checked", "checked");
}

/**
 * 反选
 * @param element
 */
function hd_reverse_select(element) {
    $(element).find($("[type='checkbox']")).attr("checked", function () {
        return !$(this).attr("checked") == 1
    });
}
//成功时执行事件
var hd_modal_success_handlel;
//关闭时执行事件
var hd_modal_cancel_handle;
/**
 * 显示对话框
 */

function hd_modal(param) {
    //宽度
    param.width = param.width || '500';
    //高度
    param.height = param.height || '200';
    //左偏移
    var left = -1 * param.width / 2;
    //标题
    param.title = param.title || '温馨提示';
    //背景遮罩
    param.shade=param.shade!=undefined?param.shade:true;
    //背景透明度
    param.shadeOpacity=param.shadeOpacity||0.9;
    //自动关闭时间 0 不关闭
    param.timeout = param.timeout || 0;
    //显示按钮
    param.button = param.button != undefined ? param.button : true;
    //按钮文字
    param.button_success = param.button_success;
    param.button_cancel = param.button_cancel;
    //内容
    param.content = param.content || '';
    //回调函数
    hd_modal_success_handlel = param.success;
    hd_modal_cancel_handle = param.cancel;
    /**
     * 删除模态元素
     */
    hd_remove_model();
    /**
     * 对话框布局
     * @type {string}
     */
    //按钮文本
    if (param.button) {
        var btnHtml = '<div class="hd-modal-btn">';
        if(param.button_success){
            btnHtml+='<a class="hd-btn hd-btn-success" href="javascript:;" onclick="hd_modal_success()">' + param.button_success + '</a>&nbsp;';
        }
        if(param.button_cancel){
          btnHtml+='<a class="hd-btn" href="javascript:;" onclick="hd_modal_close()">' + param.button_cancel + '</a>';
        }
        btnHtml+='</div>';
    } else {
        var btnHtml = '';
    }
    //遮罩元素
    if(param.shade){
        shadeHtml ='<div id="hd-modal-bg" style="opacity:'+param.shadeOpacity+';filter:alpha(opacity='+(param.shadeOpacity*10)+');">背景遮罩</div>';
    }else{
        shadeHtml='';
    }
    var html = shadeHtml+'\
    <div id="hd-modal" style="width:' + param.width + 'px;height:' + param.height + 'px;margin-left:' + left + 'px">\
        <div class="hd-modal-wrap" style="height:' + param.height + 'px">\
            <div class="hd-modal-header">\
                <span class="hd-modal-title">' + param.title + '</span>\
                <span class="hd-modal-close" onclick="hd_modal_close();"></span>\
            </div>\
            <div class="hd-modal-message">' + param.content + '</div>\
            ' + btnHtml + '\
        </div>\
    </div>';
    $('body').append(html);
    /**
     * 自动关闭处理
     */
    if (param.timeout > 0) {
        setTimeout(function () {
            hd_remove_model();
        }, param.timeout * 1000);
    }
}
/**
 * 删除模态标签
 */
function hd_remove_model() {
    //移除对话框
    $("#hd-modal").remove();
    //移除遮罩
    $("#hd-modal-bg").remove();
}
/**
 * 点击确定返回真
 * @returns {boolean}
 */
function hd_modal_success(func) {
    hd_remove_model();
    if (hd_modal_success_handlel) {
        hd_modal_success_handlel();
    }
    return true;
}
/**
 * 关闭对话框
 */
function hd_modal_close() {
    hd_remove_model();
    if (hd_modal_cancel_handle) {
        hd_modal_cancel_handle();
    }
    return false;
}
$.fn.extend({
    slide: function (options) {
        /**
         * 文字背景颜色
         * @type {bgcolor|*}
         * @private
         */
        _bgcolor = options.bgcolor?options.bgcolor:'#333'
        /**
         * div文字透明度
         * @type {bg_opacity|*|number}
         */
        options.bgopacity=options.bgopacity||0.9;
        /**
         * 文字颜色
         * @type {string|*}
         */
        options.textColor=options.textColor||'#ddd';
        /**
         * 轮换的时间
         * @type {timeout|*|_default.timeout|Number|number}
         */
        options.timeout=options.timeout||3;
        /**
         * 所有a标签
         * @type {*|jQuery}
         */
        options.alink = $(this).find("a");
        /**
         * 图片数量
         * @type {Number}
         */
        options.num = options.alink.length;
        /**
         * 设置div高度，宽度 定位
         */
        $(this).css({width: options.width, height: options.height, overflow: "hidden", position: "relative"});
        /**
         * 隐藏所有链接文字
         */
        options.alink.hide();
        /**
         * 第一个链接文字显示
         */
        options.alink.eq(0).show();

        /**
         * 文字背景div
         * @type {string}
         */
        var slideText = "<div id='_slideText' style='height: 30px;background:"+_bgcolor+";color:#fff;position: absolute;left: 0px;right: 0px;bottom: 0px;'></div>";
        $(this).append(slideText);
        /**
         * 背景透明度
         */
        $("#_slideText").css({opacity: options.bgopacity});
        /**
         * 数字
         * @type {string}
         */
        var slideNum = "<div id='_slideNum' style='position: absolute;height: 18px;bottom: 6px;right: 0px;'>";
        for (var i = 1; i <= options.num; i++) {
            slideNum += "<li style='float: left;opacity:0.8;border-radius:50%;cursor:pointer;color:#333;width: 18px;height: 18px;background: #fff;margin-right: 6px;text-align: center;line-height: 1.5em;'>" + i + "</li>"
        }
        slideNum += "</div>";
        $(this).append(slideNum);
        /**
         * 执行动画
         * @type {number}
         */
        var startIndex = 0;
        setInterval(_run, options.timeout * 1000);
        _run(0);
        function _run(i) {
            startIndex = i != undefined ? i : startIndex;
            //当前a标签
            var _cur = options.alink.eq(startIndex);
            _cur.show();
            /**
             * 隐藏其他a标签
             */
            options.alink.not(_cur).hide();
            /**
             * 改变文字
             */
            var _text = options.alink.eq(startIndex).attr("title");
            var _url=options.alink.eq(startIndex).attr("href");
            var _link="<a style='text-decoration:none;color:"+options.textColor+";' href='"+_url+"'>"+_text+"</a>";
            $("#_slideText").html("<div style='font-size:12px;line-height: 30px;text-indent: 10px;'>" + _link + "</div>");
            /**
             * 改变数字div
             */
            $("#_slideNum li").css({background: "#fff", color: "#333",'list-style':'none','font-size':'12px'});
            $("#_slideNum li").eq(startIndex).css({background: "#FF7F00", color: "#fff"})
            startIndex = startIndex+1 >= options.num ? 0 : startIndex + 1;
        }
        //为数字加事件
        $("#_slideNum li").mouseover(function () {
            var i = $(this).index();
            _run(i);
        })
    }
})
$(function () {
    $('div.hd-tab ul.hd-tab-menu li').click(function () {
        //隐藏所有内容DIV
        $('div.hd-tab-content').children('div').hide();
        //显示当前点击li对应的div
        var lab =$(this).attr('lab');
        $("div.hd-tab-content div[lab='"+lab+"']").show();
        $("div.hd-tab ul.hd-tab-menu li").removeClass('active');
        $("div.hd-tab ul.hd-tab-menu li[lab='"+lab+"']").addClass('active');
    })
})
$.fn.extend({
    validate: function (p) {
        /**
         * 对象
         * @type {*|jQuery|HTMLElement}
         */
        var Form = $(this);
        //验证失败的对象
        Form.failure = [];
        //正在运行的异步验证数量
        Form.ajaxNum = 0;
        /**
         * 绑定提交事件
         */
        Form.on('submit', function (event) {
            /**
             * 第一次触发Submit事件时记录
             */
            if (!Form.firstSubmit) {
                Form.find('input,textarea,select').trigger('change');
                Form.firstSubmit = true;
            }
            /**
             * 有验证失败的表单或有异步验证在执行时不提交
             */
            if (Form.failure.length || Form.ajaxNum != 0) {
                event.preventDefault();
            }
        });
        /**
         * 验证程序
         * @type {{}}
         */
        var Action = {
            /**
             * 必须输入
             * @param obj 表单对象
             * @param param 验证参数
             * @param success 成功信息
             * @param error 错误信息
             */
            required: function (obj, name, value, param, success, error) {
                return value != '';
            },
            email: function (obj, name, value, param, success, error) {
                return /^([a-zA-Z0-9_\-\.])+@([a-zA-Z0-9_-])+((\.[a-zA-Z0-9_-]{2,3}){1,2})$/i.test(value)
            },
            http: function (obj, name, value, param, success, error) {
                return /^(http[s]?:)?(\/{2})?([a-z0-9]+\.)?[a-z0-9]+(\.(com|cn|cc|org|net|com.cn))$/i.test(value);
            },
            phone: function (obj, name, value, param, success, error) {
                return /^\d{11}$/.test(value);
            },
            qq: function (obj, name, value, param, success, error) {
                return /^\d{5,10}$/.test(value);
            },
            tel: function (obj, name, value, param, success, error) {
                return /(?:\(\d{3,4}\)|\d{3,4}-?)\d{8}/.test(value);
            },
            identity: function (obj, name, value, param, success, error) {
                return /^(\d{15}|\d{18})$/.test(value);
            },
            china: function (obj, name, value, param, success, error) {
                return /^([^u4e00-u9fa5]|\w)+$/i.test(value);
            },
            maxlen: function (obj, name, value, param, success, error) {
                return value.length <= param;
            },
            minlen: function (obj, name, value, param, success, error) {
                return value.length >= param;
            },
            num: function (obj, name, value, param, success, error) {
                opt = param.split(/\s*,\s*/);
                return value >= opt[0] * 1 && value <= opt[1] * 1;
            },
            regexp: function (obj, name, value, param, success, error) {
                return param.test(value);
            },
            confirm: function (obj, name, value, param, success, error) {
                //比较的表单如确认密码
                var confirmObj = $("[name='" + param + "']");
                //当比对的表单事件发生时，触发主表单
                confirmObj.change(function () {
                    obj.trigger('change');
                })
                return value == confirmObj.val();
            },
            ajax: function (obj, name, value, param, success, error) {
                /**
                 * 更改Ajax验证数
                 * @type {number}
                 */
                Form.ajaxNum += 1;
                /**
                 * POST提交的数据
                 */
                var postData = param.data ? param.data : {};
                postData[name] = value;
                /**
                 * 发送验证
                 */
                $.ajax({
                    url: param.url,
                    data: postData,
                    type: 'POST',
                    dataType: 'JSON',
                    success: function (JSON) {
                        /**
                         * 移除Ajax验证的记数
                         * @type {number}
                         */
                        Form.ajaxNum -= 1;
                        /**
                         * 验证状态
                         * @type {boolean}
                         */
                        var status = JSON.status ? true : false;
                        /**
                         * 设置提示信息
                         */
                        init.setSpanMessage(status, obj, name, JSON.message, JSON.message);
                        /**
                         * 处理验证结果
                         * a) status:true 记录错误表单
                         * b) status:false 移除原来记录的错误表单
                         */
                        init.recordVerificationResult(status, name);
                    },
                    error: function () {
                        /**
                         * 服务器错误如403、404
                         */
                        init.setSpanMessage(false, obj, name, success, error);
                        init.recordVerificationResult(false, name);
                    }
                })
                /**
                 * Ajax验证中。。。。
                 */
                return 'run';
            }
        }
        /**
         * 初始化处理类
         * @type {{__init: Function, bindHander: Function}}
         */
        var init = {
            /**
             * 构造函数
             * @private
             */
            __construct: function () {
                //绑定事件
                this.bindHandler();
            },
            /**
             * 绑定事件
             */
            bindHandler: function () {
                for (var FieldName in p) {
                    /**
                     * 获得表单对象
                     */
                    var FieldObj = this.getFieldObj(FieldName);
                    //对象不存在时不处理
                    if (!FieldObj)continue;
                    //设置Span默认提示信息
                    this.setSpanDefaultMessage(FieldObj, FieldName);
                    //绑定事件
                    this.bindExeAction(FieldObj, FieldName);
                }
            },
            /**
             * 绑定执行方法
             * @param FieldObj 表单对象
             * @param FieldName 字段name名
             */
            bindExeAction: function (FieldObj, FieldName) {
                /**
                 * 获得事件名称如change
                 * @type {string}
                 */
                var EventName = this.getEventName(FieldObj);
                /**
                 * 绑定验证方法
                 * @param EventName 事件名称
                 * @param FieldObj 表单对象
                 * @param Rule 验证规则
                 */
                Form.find(FieldObj).on(EventName, {obj: FieldObj, name: FieldName}, function (event) {
                    /**
                     * 表单对象
                     */
                    var FieldObj = event.data.obj;
                    /**
                     * 表单名称
                     */
                    var FieldName = event.data.name;
                    /**
                     * 验证规则
                     * @type {*|rule|.username.rule}
                     */
                    var rule = p[FieldName].rule;
                    /**
                     * 表单值
                     */
                    var value = init.getFieldValue(FieldObj);
                    /**
                     * 必须验证字段或内容不为空时才验证
                     */
                    if (rule['required'] || value) {
                        /**
                         * 执行验证动作
                         */
                        for (var r in rule) {
                            /**
                             * 正确提示信息
                             * @type {success|.username.success|.ajax.success|x.success}
                             */
                            var successMessage = p[FieldName].success;
                            /**
                             * 错误提示信息
                             * @type {.username.error|*|Error|MediaError|cD.error|error}
                             */
                            var errorMessage = p[FieldName].error ? p[FieldName].error[r] : null;
                            /**
                             * 执行验证程序
                             * 表单对象，值，验证规则参数如require:true即true，成功信息，错误信息
                             */
                            var status = Action[r](FieldObj, FieldName, value, rule[r], successMessage, errorMessage);
                            /**
                             * 设置提示信息
                             */
                            init.setSpanMessage(status, FieldObj, FieldName, successMessage, errorMessage);
                            /**
                             * 记录验证失败的表单
                             * status true:验证通过   false:验证失败  run:Ajax验证中
                             */
                            init.recordVerificationResult(status, FieldName);
                            /**
                             * 验证失败时不进行后面规则的验证
                             */
                            if (status == false) {
                                break;
                            }
                        }
                    } else {
                        /**
                         * 非必须验证字段并且内容为空时清除span对象
                         */
                        init.hideSpanObj(FieldObj, FieldName);
                    }
                });
            },
            /**
             * 记录验证结果
             * @param status false 失败 true 成功 run 正在验证
             * @param FieldName 表单name属性
             */
            recordVerificationResult: function (status, FieldName) {
                if (status == 'run') {
                    /**
                     * Ajax验证中不进行错误表单的记录
                     */
                } else if (status) {
                    /**
                     * 验证成功
                     * 移除验证失败的表单
                     * @param FieldObj
                     */
                    Form.failure = $.grep(Form.failure, function (n, i) {
                        return n != FieldName;
                    });
                } else {
                    /**
                     * 验证失败
                     * 记录失败的表单
                     */
                    Form.failure = $.grep(Form.failure, function (n, i) {
                        return n != FieldName;
                    });
                    Form.failure.push(FieldName);
                }
            },
            /**
             * 获得表单的Value值
             * @param FieldObj
             */
            getFieldValue: function (FieldObj) {
                var type = FieldObj.attr('type');
                var value = '';
                if (type == 'radio' || type == 'checkbox') {
                    value = FieldObj.filter('[checked]').val();
                } else {
                    value = FieldObj.val();
                }
                return value != undefined || $.trim(value) != '' ? value : '';
            },
            /**
             * 获得事件名称
             * @param name
             * @returns {string}
             */
            getEventName: function (FieldObj) {
                return 'change';
            },
            /**
             * 获得表单对象
             * @param name
             */
            getFieldObj: function (name) {
                var obj = $("[name='" + name + "']");
                return obj.length == 0 ? false : obj;
            },
            /**
             * 设置Span默认提示信息
             * @param FieldName
             */
            setSpanDefaultMessage: function (FieldObj, FieldName) {
                if (p[FieldName].message) {
                    var spanObj = init.addSpanObj(FieldObj, FieldName);
                    spanObj.removeClass().addClass('hd-validate-notice').html(p[FieldName].message);
                }
            },
            /**
             * 设置提示信息
             * @param status false 失败 true 成功 run 正在验证
             * @param FieldObj 表单对象
             * @param FieldName 表单name属性
             * @param successMessage 成功信息
             * @param errorMessage 错误信息
             */
            setSpanMessage: function (status, FieldObj, FieldName, successMessage, errorMessage) {
                /**
                 * 移除Span对象
                 */
                init.hideSpanObj(FieldObj, FieldName);
                /**
                 * 设置提示信息
                 */
                if (status === 'run') {
                    //Ajax验证中...
                    //init.addSpanObj(FieldObj, FieldName).removeClass().addClass('hd-validate-success').html('Ajax...');
                } else if (status) {
                    /**
                     * 普通验证通过
                     */
                    if (successMessage)
                        init.addSpanObj(FieldObj, FieldName).removeClass().addClass('hd-validate-success').html(successMessage);
                } else {
                    /**
                     * 普通验证失败
                     */
                    if (errorMessage)
                        init.addSpanObj(FieldObj, FieldName).removeClass().addClass('hd-validate-error').html(errorMessage);
                }

            },
            /**
             * 移除Span对象
             * @param FieldName
             */
            hideSpanObj: function (FieldObj, FieldName) {
                return $('#hd_' + FieldName).css('display', 'none');
            },
            /**
             * 添加验证span标签
             * @param FieldObj 表单对象
             * @param FieldName 表单Name名
             */
            addSpanObj: function (FieldObj, FieldName) {
                //表单name名
                var spanId = "#hd_" + FieldName;
                /**
                 * 添加Span对象
                 */
                if ($(spanId).length == 0) {
                    var span = "<span id='hd_" + FieldName + "'></span>";
                    FieldObj.last().after(span);
                }
                return $(spanId).css('display', 'inline-block');
            }
        }
        /**
         * 初始化
         */
        init.__construct();
    }
});